﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Configuration;
using Entidades.Solicitud;
using System.Data;
using Entidades.Consultas.Personalizadas;
using Entidades.Catalogo;
using Persistencia.Solicitud;

namespace Persistencia.Catalogo
{
    public class PerSolicitudTrabajosRealizar : Persistencia.General.IPersistencia
    {

        public void Insertar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;

            try
            {
                comando = new OracleCommand("PK_SOLICITUD_OBRA.Registrar", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;
                conexion.Open();

                //pCVE_TRABAJO_REALIZAR        IN VARCHAR2, NUMERICO
                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTrabajoRealizar == 0 ? string.Empty : ((EntSolicitudTrabajosRealizar)entidad).CveTrabajoRealizar.ToString();
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);                

                //pDESCRIPCION                 IN VARCHAR2,
                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = ((EntSolicitudTrabajosRealizar)entidad).Descripcion;
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                //pORIGEN                      IN VARCHAR2,
                OracleParameter parametro3 = new OracleParameter();
                parametro3.OracleDbType = OracleDbType.Varchar2;
                parametro3.Value = ((EntSolicitudTrabajosRealizar)entidad).Origen;
                parametro3.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro3);

                //pDESTINO                     IN VARCHAR2
                OracleParameter parametro4 = new OracleParameter();
                parametro4.OracleDbType = OracleDbType.Varchar2;
                parametro4.Value = ((EntSolicitudTrabajosRealizar)entidad).Destino;
                parametro4.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro4);

                //pLONGITUD                    IN NUMBER, NUMERICO
                OracleParameter parametro5 = new OracleParameter();
                parametro5.OracleDbType = OracleDbType.Int32;
                parametro5.Value = int.Parse(((EntSolicitudTrabajosRealizar)entidad).Longitud);
                parametro5.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro5);

                //pINSTALACION_ORIGEN          IN VARCHAR2,
                OracleParameter parametro6 = new OracleParameter();
                parametro6.OracleDbType = OracleDbType.Varchar2;
                parametro6.Value = ((EntSolicitudTrabajosRealizar)entidad).InstalacionOrigen;
                parametro6.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro6);

                //pCVE_TIPO_PROYECTO           IN VARCHAR2, NUMERICOI
                OracleParameter parametro7 = new OracleParameter();
                parametro7.OracleDbType = OracleDbType.Varchar2;
                parametro7.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTipoProyecto;
                parametro7.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro7);

                //pDIAMETRO                    IN VARCHAR2,  NUMERICO
                OracleParameter parametro8 = new OracleParameter();
                parametro8.OracleDbType = OracleDbType.Varchar2;
                parametro8.Value = ((EntSolicitudTrabajosRealizar)entidad).Diametro;
                parametro8.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro8);

                //pNO_PERA                     IN VARCHAR2,
                OracleParameter parametro9 = new OracleParameter();
                parametro9.OracleDbType = OracleDbType.Varchar2;
                parametro9.Value = ((EntSolicitudTrabajosRealizar)entidad).NoPera;
                parametro9.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro9);

                //pCVE_SOLICITUD               IN VARCHAR2, NUMERICO
                OracleParameter parametro10 = new OracleParameter();
                parametro10.OracleDbType = OracleDbType.Varchar2;
                if (((EntSolicitudTrabajosRealizar)entidad).CveSolicitud == 0)
                    parametro10.Value = null;
                else
                    parametro10.Value = ((EntSolicitudTrabajosRealizar)entidad).CveSolicitud;

                parametro10.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro10);

                //pCVE_TIPO_SERVICIO           IN VARCHAR2, NUMERICO
                OracleParameter parametro11 = new OracleParameter();
                parametro11.OracleDbType = OracleDbType.Varchar2;
                parametro11.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTipoServicio;
                parametro11.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro11);

                //pANCHO_DERECHO_VIA           IN VARCHAR2, NUMERICO
                OracleParameter parametro12 = new OracleParameter();
                parametro12.OracleDbType = OracleDbType.Varchar2;
                parametro12.Value = ((EntSolicitudTrabajosRealizar)entidad).AnchoDerechoVia;
                parametro12.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro12);

                //pCVE_TIPO_INSTALACION        IN VARCHAR2,
                OracleParameter parametro13 = new OracleParameter();
                parametro13.OracleDbType = OracleDbType.Varchar2;
                parametro13.Value = ((EntSolicitudTrabajosRealizar)entidad).TrabajoRealizar;
                parametro13.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro13);

                //pCVE_TIPO_SIMPLIFICACION     IN VARCHAR2
                OracleParameter parametro14 = new OracleParameter();
                parametro14.OracleDbType = OracleDbType.Varchar2;
                parametro14.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTipoSimplificacion;
                parametro14.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro14);

                //pCVEOBRASIARP                IN VARCHAR2,
                OracleParameter parametro15 = new OracleParameter();
                parametro15.OracleDbType = OracleDbType.Varchar2;
                parametro15.Value = ((EntSolicitudTrabajosRealizar)entidad).CveObraSiarp;
                parametro15.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro15);

                //pCVESIARP                    IN VARCHAR2,
                OracleParameter parametro16 = new OracleParameter();
                parametro16.OracleDbType = OracleDbType.Varchar2;
                parametro16.Value = ((EntSolicitudTrabajosRealizar)entidad).CveSiarp;
                parametro16.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro16);

                //pTRABAJOS_REALIZAR           IN VARCHAR2,
                OracleParameter parametro17 = new OracleParameter();
                parametro17.OracleDbType = OracleDbType.Varchar2;
                parametro17.Value = ((EntSolicitudTrabajosRealizar)entidad).TrabajoRealizar;
                parametro17.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro17);

                //pCVE_USUARIO_MTTO            IN VARCHAR2,
                OracleParameter parametro18 = new OracleParameter();
                parametro18.OracleDbType = OracleDbType.Varchar2;
                parametro18.Value = ((EntSolicitudTrabajosRealizar)entidad).UsuarioMtto;
                parametro18.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro18);

                //pCVE_OBRA_GENERADA           OUT NUMBER,
                OracleParameter parametro19 = new OracleParameter();
                parametro19.OracleDbType = OracleDbType.Int32;
                parametro19.Direction = ParameterDirection.Output;
                comando.Parameters.Add(parametro19);

                //pCVE_AVANCE_OPERATIVO        IN VARCHAR2,  NUMERICO
                OracleParameter parametro20 = new OracleParameter();
                parametro20.OracleDbType = OracleDbType.Varchar2;
                parametro20.Value = ((EntSolicitudTrabajosRealizar)entidad).CveAvanceOperativo;
                parametro20.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro20);

                //pCVE_TIPO_OBRA_COMPLEMENTARIA IN VARCHAR2, NUMERICO
                OracleParameter parametro21 = new OracleParameter();
                parametro21.OracleDbType = OracleDbType.Varchar2;
                parametro21.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTipoObraComplementaria;
                parametro21.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro21);

                //pANCHO                       IN VARCHAR2, NUMERICO
                OracleParameter parametro22 = new OracleParameter();
                parametro22.OracleDbType = OracleDbType.Varchar2;
                parametro22.Value = ((EntSolicitudTrabajosRealizar)entidad).Ancho;
                parametro22.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro22);

                //pLARGO                       IN VARCHAR2, NUMERICO EN LA TABLA
                OracleParameter parametro23 = new OracleParameter();
                parametro23.OracleDbType = OracleDbType.Varchar2;
                parametro23.Value = ((EntSolicitudTrabajosRealizar)entidad).Largo;
                parametro23.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro23);

                //pCVE_TRABAJO_REALIZAR_PADRE  IN VARCHAR2, NUMERICO EN LA TABLA
                OracleParameter parametro24 = new OracleParameter();
                parametro24.OracleDbType = OracleDbType.Varchar2;
                parametro24.Value = null; //((EntSolicitudTrabajosRealizar)entidad).CveTrabajoRealizarPadre;
                parametro24.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro24);

                //pINSTALACION_DESTINO         IN VARCHAR2,
                OracleParameter parametro25 = new OracleParameter();
                parametro25.OracleDbType = OracleDbType.Varchar2;
                parametro25.Value = ((EntSolicitudTrabajosRealizar)entidad).InstalacionDestino;
                parametro25.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro25);

                //pCVE_CAMPO                   IN VARCHAR2, NUMERICO
                OracleParameter parametro26 = new OracleParameter();
                parametro26.OracleDbType = OracleDbType.Varchar2;
                parametro26.Value = ((EntSolicitudTrabajosRealizar)entidad).CveCampo;
                parametro26.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro26);

                //pESPRIORITARIA               IN VARCHAR2
                OracleParameter parametro27 = new OracleParameter();
                parametro27.OracleDbType = OracleDbType.Varchar2;
                parametro27.Value = ((EntSolicitudTrabajosRealizar)entidad).EsPrioritaria;
                parametro27.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro27);

                //pFECHA_PRIORITARIA               IN VARCHAR
                OracleParameter parametro28 = new OracleParameter();
                parametro28.OracleDbType = OracleDbType.Varchar2;
                parametro28.Value = ((EntSolicitudTrabajosRealizar)entidad).FechaPrioritaria;
                parametro28.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro28);

                //pFECHA_ENTREGA_PLANOS               IN VARCHAR
                OracleParameter parametro29 = new OracleParameter();
                parametro29.OracleDbType = OracleDbType.Varchar2;
                parametro29.Value = ((EntSolicitudTrabajosRealizar)entidad).FechaEntregaPlanos;
                parametro29.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro29);

                //pFECHA_PLANOS_CORREGIDOS               IN VARCHAR
                OracleParameter parametro30 = new OracleParameter();
                parametro30.OracleDbType = OracleDbType.Varchar2;
                parametro30.Value = ((EntSolicitudTrabajosRealizar)entidad).FechaPlanosCorregidos;
                parametro30.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro30);

                //pFECHA_PLANOS_VALIDADOS               IN VARCHAR
                OracleParameter parametro31 = new OracleParameter();
                parametro31.OracleDbType = OracleDbType.Varchar2;
                parametro31.Value = ((EntSolicitudTrabajosRealizar)entidad).FechaPlanosValidados;
                parametro31.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro31);

                //pFECHA_ESTIMADA_ARREGLO               IN VARCHAR
                OracleParameter parametro32 = new OracleParameter();
                parametro32.OracleDbType = OracleDbType.Varchar2;
                parametro32.Value = ((EntSolicitudTrabajosRealizar)entidad).FechaEstimadaArreglo;
                parametro32.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro32);

                //pPOA       VARCHAR
                OracleParameter parametro33 = new OracleParameter();
                parametro33.OracleDbType = OracleDbType.Varchar2;
                parametro33.Value = ((EntSolicitudTrabajosRealizar)entidad).POA;
                parametro33.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro33);

                comando.ExecuteNonQuery();

                string cve_obra_generada = comando.Parameters[18].Value.ToString();

                if (((EntSolicitudTrabajosRealizar)entidad).Jefes != null)
                {
                    String[] Jefes = ((EntSolicitudTrabajosRealizar)entidad).Jefes.Split('|');

                    for (int i = 0; i <= Jefes.Count() - 1; i++)
                    {
                        PerTurnarJefeArea perTurnarJefeArea = new PerTurnarJefeArea();
                        perTurnarJefeArea.InsertarObraTurnadaA(new EntSolicitudTurnar()
                        {
                            CveSolicitudTurnar = "",
                            CveUsuario = int.Parse(Jefes[i].ToString()),
                            Comentarios = "",
                            CveTrabajoRealizar = int.Parse(cve_obra_generada),
                            CveUsuarioTurno = int.Parse(((EntSolicitudTrabajosRealizar)entidad).UsuarioMtto)
                        });
                    }
                }

            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudTrabajosARealizar.Insertar";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudTrabajosARealizar.Insertar";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }

        public void Actualizar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;

            try
            {
                comando = new OracleCommand("PK_SOLICITUD_OBRA.Eliminar", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;
                conexion.Open();

                //pCVE_TRABAJO_REALIZAR        IN VARCHAR2, NUMERICO
                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTrabajoRealizar;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                comando.ExecuteNonQuery();
                comando.Dispose();
            }
            catch (OracleException exc)
            {
                if (exc.Number == 2292) // Esto significa que hay errores de integridad referencial.... por lo tanto no podrá borrarse
                {
                    ApplicationException excepcion = new ApplicationException("No se puede borrar la obra solicitada ya que tiene afectados asociados a ella.");
                    excepcion.Source = "PerSolicitudTrabajosARealizar.Eliminar";
                    throw excepcion;
                }
                else
                {
                    ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                    excepcion.Source = "PerSolicitudTrabajosARealizar.Eliminar";
                    throw excepcion;

                }


            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudTrabajosARealizar.Eliminar";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }

        public Entidades.General.IEntidad Obtener(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntSolicitudTrabajosRealizar ent = null;

            try
            {
                comando = new OracleCommand("PK_SOLICITUD_OBRA.getObra", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudTrabajosRealizar)entidad).CveTrabajoRealizar;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    ent = new EntSolicitudTrabajosRealizar();

                    ent.CveTrabajoRealizar = int.Parse(lector["CVE_TRABAJO_REALIZAR"] == DBNull.Value ? "0" : lector["CVE_TRABAJO_REALIZAR"].ToString());
                    ent.POA = lector["POA"].ToString();
                    ent.Descripcion = lector["DESCRIPCION"].ToString();
                    ent.Origen = lector["ORIGEN"].ToString();
                    ent.Destino = lector["DESTINO"].ToString();
                    ent.Longitud = lector["LONGITUD"].ToString();
                    ent.CveTipoProyecto = int.Parse(lector["CVE_TIPO_PROYECTO"] == DBNull.Value ? "0" : lector["CVE_TIPO_PROYECTO"].ToString());
                    ent.Diametro = float.Parse(lector["DIAMETRO"] == DBNull.Value ? "0" : lector["DIAMETRO"].ToString());
                    ent.NoPera = lector["NO_PERA"].ToString();
                    ent.CveSolicitud = int.Parse(lector["CVE_SOLICITUD"] == DBNull.Value ? "0" : lector["CVE_SOLICITUD"].ToString());
                    ent.CveTipoServicio = int.Parse(lector["CVE_TIPO_SERVICIO"] == DBNull.Value ? "0" : lector["CVE_TIPO_SERVICIO"].ToString());
                    ent.AnchoDerechoVia = float.Parse(lector["ANCHO_DERECHO_VIA"] == DBNull.Value ? "0" : lector["ANCHO_DERECHO_VIA"].ToString());
                    ent.CveTipoSimplificacion = int.Parse(lector["CVE_TIPO_SIMPLIFICACION"] == DBNull.Value ? "0" : lector["CVE_TIPO_SIMPLIFICACION"].ToString());
                    ent.CveObraSiarp = lector["CVEOBRASIARP"].ToString();
                    ent.CveSiarp = lector["CVESIARP"].ToString();
                    ent.TrabajoRealizar = lector["TRABAJOS_REALIZAR"].ToString();
                    ent.DescripcionObra = lector["DESC_OBRA"].ToString();
                    ent.FechaRegistro = DateTime.Parse(lector["FECHA_REGISTRO"].ToString());
                    ent.FechaUltimoCambio = DateTime.Parse(lector["FECHA_ULTIMO_CAMBIO"].ToString());
                    ent.CveEstatusRegistro = lector["CVE_ESTATUS"].ToString();
                    ent.CveAvanceOperativo = int.Parse(lector["CVE_AVANCE_OPERATIVO"] == DBNull.Value ? "0" : lector["CVE_AVANCE_OPERATIVO"].ToString());
                    ent.CveTrabajoRealizarPadre = int.Parse(lector["CVE_TRABAJO_REALIZAR_PADRE"] == DBNull.Value ? "0" : lector["CVE_TRABAJO_REALIZAR_PADRE"].ToString());
                    ent.CveTipoObraComplementaria = int.Parse(lector["CVE_TIPO_OBRA_COMPLEMENTARIA"] == DBNull.Value ? "0" : lector["CVE_TIPO_OBRA_COMPLEMENTARIA"].ToString());
                    ent.Ancho = float.Parse(lector["ANCHO"] == DBNull.Value ? "0" : lector["ANCHO"].ToString());
                    ent.Largo = float.Parse(lector["LARGO"] == DBNull.Value ? "0" : lector["LARGO"].ToString());
                    ent.InstalacionOrigen = lector["INSTALACION_ORIGEN"].ToString();
                    ent.InstalacionDestino = lector["INSTALACION_DESTINO"].ToString();
                    ent.EsPrioritaria = lector["ESPRIORITARIA"].ToString();
                    ent.CveCampo = int.Parse(lector["CVE_CAMPO"].ToString());

                    ent.FechaPrioritaria = lector["FECHA_PRIORITARIA"].ToString();
                    ent.FechaEntregaPlanos = lector["FECHA_ENTREGA_PLANOS"].ToString();
                    ent.FechaPlanosValidados = lector["FECHA_PLANOS_VALIDADOS"].ToString();
                    ent.FechaPlanosCorregidos = lector["FECHA_PLANOS_CORREGIDOS"].ToString();
                    ent.FechaultimoPP = lector["FECHA_ULTIMO_PP"].ToString();

                    ent.Jefes = lector["jefes"].ToString();
                    ent.DescStatus = lector["estatus"].ToString();
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudTrabajosARealizar.Obtener";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudTrabajosARealizar.Obtener";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return ent;
        }

        public List<Entidades.General.IEntidad> ObtenerTodos(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public List<Entidades.General.IEntidad> ObtenerTodos()
        {
            throw new NotImplementedException();
        }

        #region Metodos
        /// <summary>
        /// Usado en la pantalla de consultar Obra
        /// </summary>
        /// <param name="param"></param>
        public List<EntObraConDetalle> ConsultarObra(string cveSolicitud, string FechaOficio, string NoOficio, string CveSolicitante, string CveEstatus, string cve_usuario,string descObra)
        {

            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntObraConDetalle entidad = null;
            List<EntObraConDetalle> lista = new List<EntObraConDetalle>();
            try
            {

                comando = new OracleCommand("PK_SOLICITUD_OBRA.getObrasSolicitud", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();
                #region Parametros
                // cveSolicitud
                OracleParameter param1 = new OracleParameter();
                param1.OracleDbType = OracleDbType.Varchar2;
                param1.Direction = ParameterDirection.Input;
                param1.Value = (string.IsNullOrWhiteSpace(cveSolicitud) ? null : cveSolicitud);
                comando.Parameters.Add(param1);

                // FechaOficio
                OracleParameter param2 = new OracleParameter();
                param2.OracleDbType = OracleDbType.Varchar2;
                param2.Direction = ParameterDirection.Input;
                param2.Value = (string.IsNullOrWhiteSpace(FechaOficio) ? null : FechaOficio);
                comando.Parameters.Add(param2);

                // NoOficio
                OracleParameter param3 = new OracleParameter();
                param3.OracleDbType = OracleDbType.Varchar2;
                param3.Direction = ParameterDirection.Input;
                param3.Value = (string.IsNullOrWhiteSpace(NoOficio) ? null : NoOficio);
                comando.Parameters.Add(param3);

                // CveSolicitante
                OracleParameter param4 = new OracleParameter();
                param4.OracleDbType = OracleDbType.Varchar2;
                param4.Direction = ParameterDirection.Input;
                param4.Value = (string.IsNullOrWhiteSpace(CveSolicitante) ? null : CveSolicitante);
                comando.Parameters.Add(param4);

                // CveEstatus
                OracleParameter param5 = new OracleParameter();
                param5.OracleDbType = OracleDbType.Varchar2;
                param5.Direction = ParameterDirection.Input;
                param5.Value = (string.IsNullOrWhiteSpace(CveEstatus) ? null : CveEstatus);
                comando.Parameters.Add(param5);

                // CveUsuario
                OracleParameter param6 = new OracleParameter();
                param6.OracleDbType = OracleDbType.Varchar2;
                param6.Direction = ParameterDirection.Input;
                param6.Value =  cve_usuario;
                comando.Parameters.Add(param6);

                // descObra
                OracleParameter param7 = new OracleParameter();
                param7.OracleDbType = OracleDbType.Varchar2;
                param7.Direction = ParameterDirection.Input;
                param7.Value = descObra;
                comando.Parameters.Add(param7);

                
                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                #endregion

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entidad = new EntObraConDetalle()
                    {
                        CveTrabajoRealizar = int.Parse(lector["CVE_TRABAJO_REALIZAR"].ToString()),
                        Origen = lector["ORIGEN"].ToString(),
                        Destino = lector["DESTINO"].ToString(),
                        Longitud = lector["LONGITUD"].ToString(),
                        DescTipoServicio = lector["DESC_TIPO_SERVICIO"].ToString(),
                        DescCampo = lector["DESC_CAMPO"].ToString(),
                        DescTipoProyecto = lector["DESC_TIPO_PROYECTO"].ToString(),
                        DescAvanceOperativo = lector["DESC_AVANCE_OPERATIVO"].ToString(),
                        DescripcionObra = lector["DESC_OBRA"].ToString(),
                        EsPrioritaria = lector["ESPRIORITARIA"].ToString(),
                        CveEstatus = lector["CVE_ESTATUS"].ToString(),
                        NotaTurno = lector["NUMERO_NOTA_TURNO"].ToString(),
                        DescTipoInstalacion = lector["DESC_TIPO_INSTALACION"].ToString(),
                        DescStatusObra = lector["DESC_ESTATUS_OBRA"].ToString(),
                        DesAvanceOperativo = lector["DESC_AVANCE_OPERATIVO"].ToString(),
                        DescAreaSolicitante =lector["DESC_SOLICITANTE"].ToString(),
                        FechaRegistro = DateTime.Parse(lector["fecha_registro"].ToString()),
                        CveSolicitud =int.Parse( lector["CVE_SOLICITUD"].ToString())
                    };

                    lista.Add(entidad);
                }

                return lista;
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PK_SOLICITUD_OBRA.getObrasSolicitud";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PK_SOLICITUD_OBRA.getObrasSolicitud";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }

        /// <summary>
        /// Usado en el Login para mostrar las Prioritarias
        /// </summary>
        /// <returns></returns>
        public List<EntObraConDetalle> ObtenerPrioritarias(string inicial, string final)
        {

            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntObraConDetalle entidad = null;
            List<EntObraConDetalle> lista = new List<EntObraConDetalle>();
            try
            {

                comando = new OracleCommand("PK_SOLICITUD_OBRA.getObraPrioritarias", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();
                #region Parametros
                // FechaInicio
                OracleParameter param1 = new OracleParameter();
                param1.OracleDbType = OracleDbType.Varchar2;
                param1.Direction = ParameterDirection.Input;
                param1.Value = inicial;
                comando.Parameters.Add(param1);

                // FechaFin
                OracleParameter param2 = new OracleParameter();
                param2.OracleDbType = OracleDbType.Varchar2;
                param2.Direction = ParameterDirection.Input;
                param2.Value = final;
                comando.Parameters.Add(param2);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);
                #endregion

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entidad = new EntObraConDetalle()
                    {
                        CveTrabajoRealizar = int.Parse(lector["CVE_TRABAJO_REALIZAR"].ToString()),
                        Origen = lector["ORIGEN"].ToString(),
                        Destino = lector["DESTINO"].ToString(),
                        Longitud = lector["LONGITUD"].ToString(),
                        DescTipoServicio = lector["DESC_TIPO_SERVICIO"].ToString(),
                        DescCampo = lector["DESC_CAMPO"].ToString(),
                        DescTipoProyecto = lector["DESC_TIPO_PROYECTO"].ToString(),
                        DescAvanceOperativo = lector["DESC_AVANCE_OPERATIVO"].ToString(),
                        DescripcionObra = lector["DESC_OBRA"].ToString(),
                        EsPrioritaria = lector["ESPRIORITARIA"].ToString(),
                        CveEstatus = lector["CVE_ESTATUS"].ToString(),
                        NotaTurno = lector["NUMERO_NOTA_TURNO"].ToString(),

                        FechaPrioritaria = lector["FECHA_PRIORITARIA"].ToString(),
                        FechaEntregaPlanos = lector["FECHA_ENTREGA_PLANOS"].ToString(),
                        FechaPlanosValidados = lector["FECHA_PLANOS_VALIDADOS"].ToString(),
                        FechaPlanosCorregidos = lector["FECHA_PLANOS_CORREGIDOS"].ToString(),
                        FechaultimoPP = lector["FECHA_ULTIMO_PP"].ToString(),
                    };

                    lista.Add(entidad);
                }

                return lista;
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PK_SOLICITUD_OBRA.getObrasSolicitud";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PK_SOLICITUD_OBRA.getObrasSolicitud";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }

        /// <summary>
        /// Usado en la pantalla de consultar Obra
        /// </summary>
        /// <param name="param"></param>
        public List<EntObraConDetalle> ConsultarObraBandeja(string criterios, string orden, EntUsuario usuario, string status)
        {

            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntObraConDetalle entidad = null;
            List<EntObraConDetalle> lista = new List<EntObraConDetalle>();
            try
            {

                comando = new OracleCommand("PK_SOLICITUD_OBRA.getObrasSolicitudBandeja", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();
                #region Parametros
                // criterios
                OracleParameter param1 = new OracleParameter();
                param1.OracleDbType = OracleDbType.Varchar2;
                param1.Direction = ParameterDirection.Input;
                param1.Value = criterios;
                comando.Parameters.Add(param1);

                // ordern
                OracleParameter param2 = new OracleParameter();
                param2.OracleDbType = OracleDbType.Varchar2;
                param2.Direction = ParameterDirection.Input;
                param2.Value = orden;
                comando.Parameters.Add(param2);
                //Cveusuario
                OracleParameter param3 = new OracleParameter();
                param3.OracleDbType = OracleDbType.Varchar2;
                param3.Direction = ParameterDirection.Input;
                param3.Value = usuario.CveUsuario;
                comando.Parameters.Add(param3);

                //RolUsuario
                OracleParameter param4 = new OracleParameter();
                param4.OracleDbType = OracleDbType.Varchar2;
                param4.Direction = ParameterDirection.Input;
                param4.Value = usuario.CveRol;
                comando.Parameters.Add(param4);

                //Code-status seleccionado. Usado en la bandeja del supervisor
                OracleParameter param5 = new OracleParameter();
                param5.OracleDbType = OracleDbType.Varchar2;
                param5.Direction = ParameterDirection.Input;
                param5.Value = status;
                comando.Parameters.Add(param5);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                #endregion

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entidad = new EntObraConDetalle()
                    {
                        CveTrabajoRealizar = int.Parse(lector["CVE_TRABAJO_REALIZAR"].ToString()),
                        Origen = lector["ORIGEN"].ToString(),
                        Destino = lector["DESTINO"].ToString(),
                        Longitud = lector["LONGITUD"].ToString(),
                        DescTipoServicio = lector["DESC_TIPO_SERVICIO"].ToString(),
                        DescCampo = lector["DESC_CAMPO"].ToString(),
                        DescTipoProyecto = lector["DESC_TIPO_PROYECTO"].ToString(),
                        DescAvanceOperativo = lector["DESC_AVANCE_OPERATIVO"].ToString(),
                        DescripcionObra = lector["DESC_OBRA"].ToString(),
                        EsPrioritaria = lector["ESPRIORITARIA"].ToString(),
                        CveEstatus = lector["CVE_ESTATUS"].ToString(),
                        NotaTurno = lector["NUMERO_NOTA_TURNO"].ToString(),
                        TotalAfectados = lector["TOTAL_AFECTADOS"].ToString(),
                        CveSolicitud = int.Parse(lector["CVE_SOLICITUD"].ToString()),
                        EstatusSolicitud = lector["ESTATUS_SOLICITUD"].ToString()
                    };

                    lista.Add(entidad);
                }

                return lista;
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PK_SOLICITUD_OBRA.getObrasSolicitud";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PK_SOLICITUD_OBRA.getObrasSolicitud";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }

        /// <summary>
        /// Usado en la pantalla de graficas para hacer drilldown
        /// </summary>
        /// <param name="param"></param>
        public List<EntObraConDetalle> ConsultarDetalleGrafica(string cveUsuario, string cveEstatusObra, string cveSolicitante, string esPrioritaria, string cadenaBuscar)
        {

            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntObraConDetalle entidad = null;
            List<EntObraConDetalle> lista = new List<EntObraConDetalle>();
            try
            {

                comando = new OracleCommand("PKG_CONSULTAR.getAvanceObrasDetalle", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();
                #region Parametros
               
                OracleParameter param1 = new OracleParameter();
                param1.OracleDbType = OracleDbType.Varchar2;
                param1.Direction = ParameterDirection.Input;
                param1.Value = cveUsuario;
                comando.Parameters.Add(param1);

             
                OracleParameter param2 = new OracleParameter();
                param2.OracleDbType = OracleDbType.Varchar2;
                param2.Direction = ParameterDirection.Input;
                param2.Value = cveEstatusObra;
                comando.Parameters.Add(param2);
                
                OracleParameter param3 = new OracleParameter();
                param3.OracleDbType = OracleDbType.Varchar2;
                param3.Direction = ParameterDirection.Input;
                param3.Value = cveSolicitante;
                comando.Parameters.Add(param3);

                OracleParameter param4 = new OracleParameter();
                param4.OracleDbType = OracleDbType.Varchar2;
                param4.Direction = ParameterDirection.Input;
                param4.Value = esPrioritaria;
                comando.Parameters.Add(param4);

                OracleParameter param5 = new OracleParameter();
                param5.OracleDbType = OracleDbType.Varchar2;
                param5.Direction = ParameterDirection.Input;
                param5.Value = cadenaBuscar;
                comando.Parameters.Add(param5);
                
                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                #endregion

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entidad = new EntObraConDetalle()
                    {
                        CveTrabajoRealizar = int.Parse(lector["CVE_TRABAJO_REALIZAR"].ToString()),
                        EsPrioritaria = lector["ESPRIORITARIA"].ToString(),
                        InicialesSolicitante = lector["INICIALES_SOLICITANTE"].ToString(),
                        DescStatusObra = lector["DESC_ESTATUS_OBRA"].ToString(),
                        DescripcionObra = lector["DESC_OBRA"].ToString(),
                        FechaAsignada = lector["FECHA_ASIGNADA"].ToString(),
                        TotalAfectados = lector["TOTAL_AFECTADOS"].ToString(),
                        PPObtenidos = lector["PP_OBTENIDOS"].ToString(),
                        PPEnviados = lector["PP_ENVIADOS"].ToString(),
                        PPPendientes = lector["PP_PENDIENTES"].ToString(),
                        Asignados = lector["ASIGNADOS"].ToString(),
                        DesStatusObra = lector["DESC_ESTATUS_OBRA"].ToString(),
                        FechaUltimoCambio = lector["ULTIMA_ACTUALIZACION"] != DBNull.Value ? DateTime.Parse(lector["ULTIMA_ACTUALIZACION"].ToString()) : DateTime.Now,
                        NotaTurno = lector["NO_OFICIO"].ToString()
                    };

                    lista.Add(entidad);
                }

                return lista;
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PKG_CONSULTAR.getAvanceObrasDetalle";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PKG_CONSULTAR.getAvanceObrasDetalle";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }
        #endregion
    }
}
